/**
 * https://blog.csdn.net/it_is_me_a/article/details/99870530?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscanv2&utm_relevant_index=2
 */
#ifndef _LINEARGLIST_H_
#define _LINEARGLIST_H_

// 扩展线性储存
typedef char DataType;
typedef enum {
  ATOM, LIST
} NodeTag;

// 结点定义
typedef struct GLNode {
  NodeTag tag;
  union {
    DataType data;
    struct GLNode *subList;
  } un;
  struct GLNode *nextp;
} GLNode;

// 创建
// 假定广义表中的元素类型DataType为char类型，每个原子的值被限定为英文字母。并假定广义表是一个表达式，其格式为：元素之间用一个逗号分割，表元素的起止符号分别为左，右括号，空表在其圆括号内不包含任何字符。
// 建立广义表存储结构的算法同样是一个递归算法。
// 该算法使用一个具有广义表格式的字符串参数s，返回由他生成的广义表存储结构的头结点指针h。
// 在算法的执行过程中，需要从头到尾扫描s的每一个字符。
// 当碰到左括号时，表明它是一个表元素的开始，则应该建立一个由h指向的表结点，并由它的sublist作为子表的表头指针进行递归调用，来建立子表的存储结构；
// 当碰到一个英文字母，表明它是一个原子，则应该建立一个由h指向的原子结点；
// 当碰到一个右括号，表明它是一个空表，应该h置为空。
// 当建立一个由h指向的结点后，接着碰到逗号字符时，表明存在后继结点，需要建立当前结点的后继表；
// 否则表明当前所处理的表已经结束，应该置当前结点的link为空。
GLNode *createGL(char *s);

// 输出广义表运算算法
// 以g作为不带节点附加节点的广义表的表头指针，打印输出该广义表时，需要对子表进行递归调用
// 
void DispGL(GLNode* g);

// 求广义表长度运算算法

// 求广义表深度运算算法

// 复制广义表运算算法

/// 求表头运算算法

// 求表尾运算算法

#endif